package com.sky.controller.admin;

import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import com.sky.dto.DishDTO;
import com.sky.dto.DishPageQueryDTO;
import com.sky.entity.Dish;
import com.sky.mapper.DishMapper;
import com.sky.result.PageResult;
import com.sky.result.Result;
import com.sky.service.DishService;
import com.sky.service.impl.DishServiceImpl;
import com.sky.vo.DishVO;
import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.annotations.Insert;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.web.bind.annotation.*;

import java.util.List;
import java.util.Set;

@RestController
@RequestMapping("/admin/dish")
@Slf4j
public class DishController {

    @Autowired
    private DishService dishService;
    @Autowired
    private DishServiceImpl dishServiceImpl;
    @Autowired
    private RedisTemplate redisTemplate;

    //分类也需要 所以在mapper层要定义两个方法 且属于一个事务
    @PostMapping
    public Result addDish(@RequestBody DishDTO dishdto) {
        log.info("addDish"+dishdto);
        dishService.addDish(dishdto);
        //删除缓存，只影响一个
        String key="dish_"+dishdto.getCategoryId();
        redisTemplate.delete(key);
        return Result.success();
    }

    @GetMapping("/page")
    //param格式传参 传来五个数据，前两个是页码和个数，后三个是动态查询 其中一个是逻辑外键
    public Result<PageResult> page(DishPageQueryDTO dishPageQueryDTO) {
        log.info("菜品分页查询");
        PageResult pageResult= dishService.pageQuery(dishPageQueryDTO);
        return Result.success(pageResult);

    }


    //根据id删除菜品 但需要判断
    @DeleteMapping
    //@RequestParam 用于将请求参数绑定到方法的参数上。它常用于接收前端通过 URL 查询参数或表单提交的数据。例如：
    //@GetMapping("/test")
    //public Result test(@RequestParam String name) {
    //    // 前端请求 /test?name=张三 时，name 参数会被赋值为 "张三"
    //}
    public Result deleteDish(@RequestParam List<Long> ids) {
    dishService.delete(ids);
    //删除菜品可能影响多个分类
        cleanhuancun("dish_*");
    return Result.success();
}

    @GetMapping("/{id}")
    public Result<DishVO> getDishById(@PathVariable Long id) {

        /*
@PathVariable 用于将 URL 路径中的模板变量绑定到方法参数。

在本方法中配合 @GetMapping("/{id}")，请求 GET /admin/dish/123 时，路径里的 123 会被绑定到参数 id。
若参数名与路径变量名不一致，可写成 @PathVariable("id") Long dishId。
可指定可选性和类型转换，如 required=false 或使用 Optional<Long>。
与 @RequestParam（绑定查询参数，如 ?id=123）不同。*/
        log.info("查询菜品 页面回显！！！！");
        DishVO dishVO= dishService.getById(id);
        return Result.success(dishVO);
    }

    @PutMapping
    public Result updateDish(@RequestBody DishDTO dishdto) {
        log.info("修改菜品啊啊啊啊啊啊");
        dishService.update(dishdto);
        cleanhuancun("dish_*");
        return Result.success();
    }

    //菜品最后一个接口 设置售卖状态
    @PostMapping("/status/{status}")
    public Result openorclose(@PathVariable Integer status,@RequestParam Long id) {
        log.info("修改售卖状态");
        dishService.closeoropen(status,id);
        //还得查询是哪个dish分类下的菜品售卖状态改变，会得不偿失
        cleanhuancun("dish_*");
        return Result.success();
    }

    @GetMapping("/list")
    public Result<List<Dish>> list(Long categoryId){
        List<Dish> list = dishService.list(categoryId);
        return Result.success(list);
    }

    private void cleanhuancun(String pattern){
        Set keys = redisTemplate.keys(pattern);
        redisTemplate.delete(keys);
    }
}
